/**
 * 文件名：@CookieUtil.java <br/>
 * 包名：cn.efunbox.afw.web.util <br/>
 * 项目名：afw-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.util;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.util.StringUtils;

/**
 * 类名：CookieUtil  <br />
 *
 * 功能：cookie操作的工具类
 *
 * @author xtwin <br />
 * 创建时间：2016年7月28日 下午3:19:39  <br />
 * @version 2016年7月28日
 */
public class CookieUtil {
	
	// KEY
	private static final String KEY_COOKIES_REQUEST = "_KEY_COOKIES_REQUEST";
	
	/**
	 * 功能：从header中解析出cookie <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月16日 下午12:11:02 <br/>
	 */
	@SuppressWarnings("unchecked")
	public static Cookie parseCookie(HttpServletRequest request, String name) {
		// 取出缓存
		Map<String, Cookie> map = (Map<String, Cookie>) request.getAttribute(KEY_COOKIES_REQUEST);
		
		if (null == map) {
			map = new HashMap<>();
			
			// 取得请求头中的cookie串，结构：name1=value1;name2=value2...
			String text = request.getHeader("cookie");
			if (! StringUtils.isEmpty(text)) {
				for (String str : text.split(";")) {
					String _name = str;
					String _value = null;
					
					// 名称和值处理
					int index = str.indexOf('=');
					if (index != -1) {
						_name = str.substring(0, index);
						_value = str.substring(index +1);
					}
					
					// 去掉两端的空格
					_name = _name.trim();
					
					// 放入到map中
					map.put(_name, new Cookie(_name, _value));
				}
			}
		}
		
		return map.get(name);
	}

	/**
	 * 功能：取得指定名称的cookie <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年7月28日 下午3:20:34 <br/>
	 */
	public static Cookie findCookie(HttpServletRequest request, String name) {
		// 取得所有的cookie
		Cookie[] cookies = request.getCookies();
		
		if (cookies == null || cookies.length == 0) {
			return null;
		}
		
		// 根据名称过滤到指定的cookie
		for (Cookie cookie : cookies) {
			if (cookie.getName().equals(name)) {
				return cookie;
			}
		}
		
		return null;
	}
	
	/**
	 * 功能：添加cookie <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年7月28日 下午3:25:08 <br/>
	 */
	public static Cookie addCookie(HttpServletRequest request, HttpServletResponse response, String name, String value, Integer expiry, String domain) {
        Cookie cookie = new Cookie(name, value);
        if (expiry != null) {
            cookie.setMaxAge(expiry);
        }
        
        if (! StringUtils.isEmpty(domain)) {
        	cookie.setDomain(domain);
        }
        
        cookie.setPath(StringUtils.isEmpty(request.getContextPath()) ? "/" : request.getContextPath());
        
        response.addCookie(cookie);
        
        return cookie;
	}
}
























